package com.ten.java.doinit.common;

import com.alibaba.fastjson2.annotation.JSONField;
import com.ten.java.doinit.service.create.impl.CreateDaoFileService;
import com.ten.java.doinit.service.create.impl.CreateModelFileService;
import com.ten.java.doinit.service.create.impl.CreateServiceService;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.springframework.context.ConfigurableApplicationContext;

import java.util.List;
import java.util.Map;

/**
 * 全局上下文
 * @author zhangxs
 * @date 2022/7/8 9:39
 */
public class Context {

    private Context() {}

    /**
     * spring全局上下问对象
     */
    public static ConfigurableApplicationContext applicationContext;

    /**
     * 项目名称
     */
    public static final String APP_NAME = "doinit";

    /**
     * 运行路径
     */
    public static String runPath;

    /**
     * 配置文件路径
     */
    public static String configPath;

    /**
     * 初始化配置类
     * @author zhangxs
     * @date 2022/7/11 15:33
     */
    public static class Config {

        /**
         * 驱动类，后续可考虑进行扩充
         */
        public static final String DRIVER_CLASS_NAME = "com.mysql.cj.jdbc.Driver";

        /**
         * 数据库访问路径
         */
        public static String url;

        /**
         * 用户名
         */
        public static String username;

        /**
         * 密码
         */
        public static String password;

        /**
         * 数据库ip地址
         */
        public static String databaseName;

        /**
         * 项目路径
         */
        public static String projectPath;

        /**
         * 项目包路径
         */
        public static String packagePath;

        /**
         * 注释中的作者信息
         */
        public static String author;

        /**
         * 注释中的时间格式
         */
        public static String pattern;

        /**
         * 生成文件时使用的编码格式
         */
        @JSONField
        public static String charset = "GBK";

        /**
         * 创建文件的服务类集合
         */
        public static List<CreateOption> createOptions;

        /**
         * 列map，映射mysql列与java字段的关系。
         * 由于导包的问题，映射时，除了基础类型以外，其他类型均使用'?'进行填充。
         */
        public static Map<String, String> columnMap;

        /**
         * 初始化配置文件
         * @param url 数据库连接路径
         * @param username 用户名
         * @param password 密码
         * @param projectPath 文件路径（创建文件会在该目录下进行创建）
         * @param packagePath 包路径
         * @return void
         * @author zhangxs
         * @date 2022/7/11 15:35
         */
        public static void init(String url, String username, String password, String projectPath, String packagePath) {
            Config.url = url;
            Config.username = username;
            Config.password = password;
            Config.projectPath = projectPath;
            Config.packagePath = packagePath;

            String[] split = url.split("\\?");
            String databaseName = split[0];
            databaseName = databaseName.substring(databaseName.lastIndexOf("/") + 1, databaseName.length());
            Config.databaseName = databaseName;
        }
    }

    /**
     * 可创建的文件的枚举类
     * @author zhangxs
     * @date 2022/7/12 14:50
     */
    @Getter
    @AllArgsConstructor
    public static enum CreateOption {

        /**
         * 实体类
         */
        MODEL(CreateModelFileService.class.getName()),

        /**
         * 持久化接口
         */
        DAO(CreateDaoFileService.class.getName()),

        /**
         * 服务类
         */
        SERVICE(CreateServiceService.class.getName());

        // 对应的服务类的类名
        String className;
    }
}
